/**
 * @Author      : maolin
 * @Date        : 2021/3/27
 * @Version     : 1.0
 * @Description :
 **/
import XEUtils from "xe-utils";

/**
 * 合并行，用于订单列表，一个订单号对应多个子项
 * @param row           当前行的数据
 * @param _rowIndex     当前行的索引
 * @param column        当前行拥有的列配置
 * @param visibleData   可视的数据
 * @param uniqueField   多行合并需要指定一个唯一字段，多行中这个字段相同时则进行合并，如'orderId'
 * @param extraFields array 多行需要合并的额外字段，传递的是数组，如['name', 'age']
 */

export function mergeRowMethod({ row, _rowIndex, column, visibleData }, uniqueField, extraFields) {
  const fields = [uniqueField];
  let property = uniqueField;
  const cellValue = XEUtils.get(row, property);
  if ( (cellValue && fields.includes(column.property)) || extraFields.includes(column.property) || column.type === 'checkbox' || column.type === 'seq' || column.property === '__operation') {
    const prevRow = visibleData[_rowIndex - 1];
    let nextRow = visibleData[_rowIndex + 1];
    if (prevRow && XEUtils.get(prevRow, property) === cellValue) {
      return { rowspan: 0, colspan: 0 };
    } else {
      let countRowspan = 1;
      while (nextRow && XEUtils.get(nextRow, property) === cellValue) {
        nextRow = visibleData[++countRowspan + _rowIndex];
      }
      if (countRowspan > 1) {
        return { rowspan: countRowspan, colspan: 1 };
      }
    }
  }
}

/**
 * 格式化金额
 * @param num
 * @param digits
 * @returns {*}
 */
export function formatAmount (num, digits = 3) {
  if (!num && num != 0) {
    return '';
  }
  return XEUtils.commafy(XEUtils.toNumber(num), { digits: digits });
}

/**
 * 获取数据源中的单位
 * @param data          数据源对象，如{unit: [{text: 'kg', value: 12}]}
 * @param name          属性名称，如：unit
 * @param value         当前的值，如：12
 * @param valueField    值的字段名，如：value
 * @param exportField   需要输出的字段名，如：text
 * @returns {null}
 */
export function getSourceUnit(data, name, value, valueField = 'value', exportField = 'text') {
  if (data && data[name]) {
    const array = data[name];
    if (valueField) {
      for (let i in array) {
        if (array[i][valueField] == value) {
          return array[i][exportField] || null;
        }
      }
    }
  }
  return null;
}

/**
 * 生成需求数量
 * @param row                       行数据对象
 * @param editable                  当前表格是否可编辑，不可编辑直接使用服务端的给定值显示而不是计算
 * @param detailTableDataSource     数据源对象
 * @param mainUnitName              库存单位字段名
 * @param mainNumName               库存数量字段名
 * @param getDemandNum              自定义获取需求数量的函数
 * @returns {string}
 */
export function formatDemandNum({row, editable, detailTableDataSource, mainUnitName = 'mainUnit', mainNumName = 'mainNum'}, getDemandNum) {
  let num = getDemandNum(row);
  if (!editable) {
    num = row[mainNumName];
  }
  let numStr = formatAmount(num, 2);
  let unit = getSourceUnit(detailTableDataSource, mainUnitName, row[mainUnitName]);
  unit = unit ? '(' + unit + ')' : '';
  return {formatter: num ? `${numStr}${unit}` : '', num };
}

/**
 * 批量更新表格
 * @param tableData         array：表格数据
 * @param data              object：批量修改的表格行数据
 * @param effectRow         array：唯一行字段, 如有多个字段，需要多个字段同时不为空时表示该行为有效行
 * @returns {*}             array：表格数据
 */
export function batchChangeTable({tableData, data, effectRow}) {
  for (let i in tableData) {
    let item = tableData[i];
    if (effectRow && effectRow.length > 0) {
      let isEffect = true;
      for (let j in effectRow) {
        if (item[effectRow[j]] === undefined || item[effectRow[j]] === null || item[effectRow[j]] === '') {
          isEffect = false;
          break;
        }
      }
      if (isEffect) {
        item = Object.assign(tableData[i], data);
      }
    } else {
      item = Object.assign(tableData[i], data);
    }
  }
  return tableData;
}
export function getTableSourceMapRow( {row,sourceMap, insertRow, i}) {
  if (insertRow[i] !== undefined && insertRow[i] !== null) {
    if (typeof sourceMap[i] === 'string') {
      row[sourceMap[i]] = insertRow[i];
    } else if (typeof sourceMap[i] === 'object'){
      row[sourceMap[i].field] = sourceMap[i].valueFunction({row: insertRow, field: i});
    }
  }
  return row;
}


